//-----------------------Standard RISC-V defines, DO NOT TOUCH IT!-----------------
//---------------------------------RISCV opcode define-----------------------------
`define YSYX210152_lui_encode 	                7'b0110111
`define YSYX210152_auipc_encode	                7'b0010111
`define YSYX210152_jal_encode	                7'b1101111
`define YSYX210152_jalr_encode	                7'b1100111
`define YSYX210152_branch_encode	            7'b1100011
`define YSYX210152_load_encode 	                7'b0000011
`define YSYX210152_store_encode	                7'b0100011
`define YSYX210152_imm_encode	                7'b0010011
`define YSYX210152_imm32_encode                 7'b0011011
`define YSYX210152_reg_encode	                7'b0110011	                //R type指令opcode
`define YSYX210152_reg32_encode                 7'b0111011	
`define YSYX210152_mem_encode	                7'b0001111	                //MISC-MEM指令OPCODE，
`define YSYX210152_system_encode                7'b1110011	
`define YSYX210152_amo_encode	                7'b0101111
`define YSYX210152_m32_encode	                7'b0111011

//------------------------------------RISC-V Privlage Defines---------------------
`define YSYX210152_Machine                      2'b11
`define YSYX210152_Supervisior                  2'b01
`define YSYX210152_User                         2'b00
//------------------------------------CSRs----------------------------------------
//----------CSR index------------------------
//          YSYX210152_User read only
`define YSYX210152_uro_cycle_index 			    12'hc00	        //YSYX210152_User read only, a shadow of YSYX210152_Machine mode cycle counter
`define YSYX210152_uro_time_index  			    12'hc01	        //YSYX210152_User read only, a shadow of YSYX210152_Machine mode time
`define YSYX210152_uro_instret_index 		    12'hc02         //YSYX210152_User read only, a shadow of instruction retired counter
`define YSYX210152_uro_hpmcounter3_index		12'hc03         //YSYX210152_User read only, performance counter3
`define YSYX210152_uro_hpmcounter4_index 	    12'hc04         //YSYX210152_User read only, performance counter4
`define YSYX210152_urw_halt_index               12'hcc0         //halt pulse generate csr, write to this csr will cause a halt (for ysyx difftest use) 
`define YSYX210152_urw_print_index              12'hcc1         //print function generate csr, value write to this csr will display on YSYX210152_Simulation tool
//   YSYX210152_Supervisior mode read and write
`define YSYX210152_srw_sstatus_index			12'h100
`define YSYX210152_srw_sie_index 			    12'h104
`define YSYX210152_srw_stvec_index 			    12'h105
`define YSYX210152_srw_scounteren_index 		12'h106
`define YSYX210152_srw_sscratch_index 		    12'h140
`define YSYX210152_srw_sepc_index 			    12'h141
`define YSYX210152_srw_scause_index 			12'h142
`define YSYX210152_srw_stval_index 			    12'h143
`define YSYX210152_srw_sip_index 			    12'h144
`define YSYX210152_srw_satp_index 			    12'h180
//    YSYX210152_Machine mode read only
`define YSYX210152_mro_mvendorid_index 		    12'hf11
`define YSYX210152_mro_marchid_index 		    12'hf12
`define YSYX210152_mro_mimp_index 			    12'hf13
`define YSYX210152_mro_mhardid_index 		    12'hf14
`define YSYX210152_mrw_mstatus_index 		    12'h300
`define YSYX210152_mro_misa_index 			    12'h301
`define YSYX210152_mrw_evangelion_index         12'hbc0         //YSYX210152_Machine mode read/write, this csr is for sepecial use 
`define YSYX210152_mrw_kernelcfg_index          12'hbc1         //YSYX210152_Machine mode read/write, this csr is set to control some modules in kernel
//     YSYX210152_Machine mode read and write
`define YSYX210152_mrw_medeleg_index 		    12'h302
`define YSYX210152_mrw_mideleg_index 		    12'h303	
`define YSYX210152_mrw_mie_index 			    12'h304
`define YSYX210152_mrw_mtvec_index 			    12'h305
`define YSYX210152_mrw_mcounteren_index 		12'h306
`define YSYX210152_mrw_mscratch_index 		    12'h340
`define YSYX210152_mrw_mepc_index 			    12'h341
`define YSYX210152_mrw_mcause_index 			12'h342
`define YSYX210152_mrw_mtval_index 			    12'h343
`define YSYX210152_mrw_mip_index 			    12'h344
`define YSYX210152_mrw_pmpcfg0_index 		    12'h3a0
`define YSYX210152_mrw_pmpaddr0_index 		    12'h3b0
`define YSYX210152_mrw_pmpaddr1_index 		    12'h3b1
`define YSYX210152_mrw_mcycle_index 			12'hb00
`define YSYX210152_mrw_minstret_index 		    12'hb02
`define YSYX210152_mrw_mhpcounter3_index 	    12'hb03
`define YSYX210152_mrw_mhpcounter4_index	 	12'hb04
`define YSYX210152_mrw_mcountinhibit_index      12'h320
`define YSYX210152_mrw_mhpmevent3_index 		12'h323

//----------Async maskable interrupt---------
`define YSYX210152_int_s_soft                   'd1             //s-mode software interrupt
`define YSYX210152_int_m_soft                   'd3             //m-mode software interrupt
`define YSYX210152_int_s_timer                  'd5
`define YSYX210152_int_m_timer                  'd7
`define YSYX210152_int_s_exter                  'd9
`define YSYX210152_int_m_exter                  'd11
//-----------None maskable interrupt---------
`define YSYX210152_nmi_PwrLost                  'd17            //power lost
`define YSYX210152_nmi_EccErr                   'd18            //Ecc error
`define YSYX210152_nmi_generic                  'd19            //NMI for general purpose use
//----------Sync exception-----------------
`define YSYX210152_exc_InstrAddrMis             'd0
`define YSYX210152_exc_InstrAccFlt              'd1
`define YSYX210152_exc_illins                   'd2
`define YSYX210152_exc_BreakPoint               'd3
`define YSYX210152_exc_LoadAddrMis              'd4
`define YSYX210152_exc_LoadAccFlt               'd5
`define YSYX210152_exc_StoreAddrMis             'd6
`define YSYX210152_exc_StoreAccFlt              'd7
`define YSYX210152_exc_EcallFromU               'd8
`define YSYX210152_exc_EcallFromS               'd9
`define YSYX210152_exc_EcallFromM               'd11
`define YSYX210152_exc_InstrPageFlt             'd12
`define YSYX210152_exc_LoadPageFlt              'd13
`define YSYX210152_exc_StorePageFlt             'd15
//---------------------------------Sv39CT defines-----------------------------------
`define YSYX210152_Sv39_V 			            0
`define YSYX210152_Sv39_R			            1
`define YSYX210152_Sv39_W			            2
`define YSYX210152_Sv39_X			            3
`define YSYX210152_Sv39_U			            4
`define YSYX210152_Sv39_G			            5
`define YSYX210152_Sv39_A			            6
`define YSYX210152_Sv39_D 			            7
`define YSYX210152_Sv39_C			            63                          //can be cache
`define YSYX210152_Sv39_T			            62                          //write Through
`define YSYX210152_Sv39_Bare                    4'h0
`define YSYX210152_Sv39_On                      4'h8
//-----------------------------------TLB & MMU modules commands----------------------------
`define YSYX210152_TLB_CMD_NOP                  8'h00
`define YSYX210152_TLB_CMD_rLUT                 8'h01
`define YSYX210152_TLB_CMD_wLUT                 8'h02
`define YSYX210152_TLB_CMD_xLUT                 8'h03
`define YSYX210152_TLB_CMD_FLUSH                8'h05
`define YSYX210152_TLB_RPL_NOP                  8'h00
`define YSYX210152_TLB_RPL_rPERR                8'h11                   //读页面错误
`define YSYX210152_TLB_RPL_wPERR                8'h12                   //写页面错误
`define YSYX210152_TLB_RPL_xPERR                8'h13                   //执行页面错误
`define YSYX210152_TLB_PRL_RDY                  8'h80
//--------------------------------FIB bus commands-----------------------------------------
`define YSYX210152_FIB_CMD_NOOP                 8'h00
`define YSYX210152_FIB_CMD_SIGR                 8'h01
`define YSYX210152_FIB_CMD_SIGW                 8'h02
`define YSYX210152_FIB_CMD_SEQR                 8'h03
`define YSYX210152_FIB_CMD_SEQW                 8'h04
`define YSYX210152_FIB_CMD_WAPR                 8'h05
`define YSYX210152_FIB_CMD_WAPW                 8'h06
`define YSYX210152_FIB_CMD_AMOR                 8'h07
`define YSYX210152_FIB_CMD_AMOW                 8'h08
`define YSYX210152_FIB_CMD_SEQE                 8'h14
//                        FIB-A extension
`define YSYX210152_FIB_CMD_LR                   8'h20
`define YSYX210152_FIB_CMD_SC                   8'h21
`define YSYX210152_FIB_CMD_AMOSWAP              8'h22
`define YSYX210152_FIB_CMD_AMOADD               8'h23
`define YSYX210152_FIB_CMD_AMOXOR               8'h24 
`define YSYX210152_FIB_CMD_AMOAND               8'h25
`define YSYX210152_FIB_CMD_AMOOR                8'h26
`define YSYX210152_FIB_CMD_MIN                  8'h27
`define YSYX210152_FIB_CMD_MAX                  8'h28
`define YSYX210152_FIB_CMD_MINU                 8'h29
`define YSYX210152_FIB_CMD_MAXU                 8'h2A
//                         FIB reply
`define YSYX210152_FIB_RPL_NOOP                 8'h00
`define YSYX210152_FIB_RPL_TRDY                 8'h10                   //Transmission Ready
`define YSYX210152_FIB_RPL_SEQ                  8'h14
`define YSYX210152_FIB_RPL_MODF                 8'h20                   //Modify Data (if have)
`define YSYX210152_FIB_RPL_TERR                 8'hF0
`define YSYX210152_FIB_RPL_IDLE                 8'hFF
//----------------------------------IDU instructions---------------------------------------

//-----------------------------------ALU operation defines---------------------------------
`define YSYX210152_ALU_NOP         8'h00                       //No operation, nothing happen
`define YSYX210152_ALU_JAL         8'h03                       //rd_data <= pc+4
`define YSYX210152_ALU_CSRW        8'h04                       //if(ds1==ds2) BPflt <= 0; else BPflt <= 1
`define YSYX210152_ALU_CSRS        8'h05
`define YSYX210152_ALU_CSRC        8'h06
`define YSYX210152_ALU_ADD         8'h08
`define YSYX210152_ALU_SUB         8'h0F
`define YSYX210152_ALU_SLT         8'h09
`define YSYX210152_ALU_XOR         8'h0A
`define YSYX210152_ALU_OR          8'h0B
`define YSYX210152_ALU_AND         8'h0C
`define YSYX210152_ALU_SL          8'h0D
`define YSYX210152_ALU_SR          8'h0E
//       some shits
`define YSYX210152_ALU_BCDADD      8'h10
`define YSYX210152_ALU_BCDMIN      8'h11
`define YSYX210152_ALU_BCDADJ      8'h12
`define YSYX210152_ALU_BCDIADJ     8'h13
//--------------------------------LSU operation defines-------------------------------------
//-------------------------------
`define YSYX210152_LSU_NOP         8'h00
`define YSYX210152_LSU_eXecute     8'h01   //Abandoned
`define YSYX210152_LSU_READ        8'h02
`define YSYX210152_LSU_WRITE       8'h03
`define YSYX210152_LSU_TLBRef      8'h06                       //TLB entry refersh
`define YSYX210152_LSU_CacheRef    8'h07                       //Cache refersh (write back all modification and disvalid)
//RV-A
`define YSYX210152_LSU_READ_Lock   8'h20   //Abandoned                    //Read from memory, and Lock the bus LR
`define YSYX210152_LSU_WRITE_Unloc 8'h21   //Abandoned                    //Write to memory, and release bus  SC
`define YSYX210152_LSU_AMOSWAP     8'h22
`define YSYX210152_LSU_AMOADD      8'h23
`define YSYX210152_LSU_AMOXOR      8'h24
`define YSYX210152_LSU_AMOAND      8'h25
`define YSYX210152_LSU_AMOOR       8'h26
`define YSYX210152_LSU_AMOMAX      8'h27
`define YSYX210152_LSU_AMOMIN      8'h28
`define YSYX210152_LSU_AMOMAXU     8'h29
`define YSYX210152_LSU_AMOMINU     8'h2A
//--------------------------------Mcop operation defines-----------------------------------
`define YSYX210152_Mcop_NOP        8'h00
`define YSYX210152_Mcop_MUL        8'h01
`define YSYX210152_Mcop_MULH       8'h02
`define YSYX210152_Mcop_MULHS      8'h03
`define YSYX210152_Mcop_DIV        8'h04
`define YSYX210152_Mcop_REM        8'h05
//--------------------------------Operation Information Defines----------------------------
`define YSYX210152_Sign64          2'b00                       //Sign extension, 64bit operation
`define YSYX210152_Sign32          2'b10                       //Sign extension, 32bit operation
`define YSYX210152_Unsign64        2'b01                       //Unsign ............
`define YSYX210152_Unsign32        2'b11                       //Unsign ............
`timescale 1ns/100ps